import { isNotEmptyObj, TypeDefault } from './core'
import { FormatDate } from './format_date'
interface FilterOpt {
  target: { [key: string]: any }
  key?: string
  defaultFill?: any
  type?: 'default' | 'date' | 'normal'
  format?: string
  prefix?: string | number
  suffix?: string | number
}
/**
 * 对后台返回的数据二次处理，可默认填充，可加前后缀
 * @param opt  参数
 * obj原数据, key需处理的字段key, defaultFill无值默认填充的, type数据区分日期类型, prefix,suffix前后缀
 * @returns 最终处理后的新数据
 */
export const FilterApiData = (opt: FilterOpt) => {
  const { target, key, defaultFill, prefix, suffix, type, format } = {
    ...{
      defaultFill: '--',
      prefix: '',
      suffix: '',
      type: 'default',
      format: 'yyyy-MM-dd',
    },
    ...opt,
  }
  let result: any
  if (type == 'default') {
    if (!key) {
      result = isNotEmptyObj(target)
        ? prefix + '' + target + '' + suffix
        : defaultFill
    } else {
      result = isNotEmptyObj(target)
        ? prefix + '' + (target[key] || defaultFill) + '' + suffix
        : defaultFill
    }
  } else {
    if (!key) {
      result = isNotEmptyObj(target) ? target : defaultFill
    } else {
      result = isNotEmptyObj(target) ? target[key] || defaultFill : defaultFill
    }
  }
  if (type == 'date' && result && result != '--') {
    result = FormatDate(result, format)
  }
  return result
}

/**
 * 解决后台返回数据类型跟前台定义不一致导致前台报错问题
 * 初始化数据为前台定义的数据类型
 * @param apiData 后台接口返回的数据
 * @param target 前台定义的数据
 */
export const SetData = (
  apiData: { [key: string]: any },
  target: { [key: string]: any }
) => {
  Object.keys(target).forEach((key) => {
    if (apiData[key] !== undefined) {
      target[key] = apiData[key] || TypeDefault(target[key])
    }
  })
  return target
}
/**
 * 通过 value 取对应的 name
 * @param params
 * getLabelWithList({target: [{sex:1, label: '章三'},{sex:2, label: '章三岁'}], key: 'sex', value: 1})
 * 章三
 */
interface LabelWithListParams {
  target: Array<any> // 原数组
  key?: string
  value: string | number | Array<any>
  labelKey?: string // 取值的key
  connectStr?: string // 数组中字符串分割符号
  defaultFill?: string // 处理无值填充
}
export const getLabelWithList = (params: LabelWithListParams): string => {
  params = {
    ...{
      labelKey: 'label',
      defaultFill: '--',
      connectStr: ',',
      key: '',
    },
    ...params,
  }
  if (!params.target.length) return params.defaultFill || ''
  let result = ''
  const connectStr = params.connectStr
  const findFn = (key: string, value: any) => {
    // 从愿数组中找到指定key对应的当前value的项
    const find = params.target.find(
      (item) => (key ? item[key] || '' : item || '') === value
    )
    if (find) {
      return typeof find === 'object' ? find[params.labelKey || ''] : find
    } else {
      return ''
    }
  }
  if (Array.isArray(params.value)) {
    params.value.forEach((value: any) => {
      const str = findFn(params.key || '', value)
      result += str ? str + connectStr : ''
    })
    result = result.slice(0, -1)
  } else {
    result = findFn(params.key || '', params.value)
  }
  return result || params.defaultFill || ''
}
